const http = require("http")
const fs = require("fs")
const url = require("url")
const qs = require("querystring")


http.createServer((req,res)=>{
    if(req.url.includes("/api")){
        dataRequest(req,res);
    }else{
        fileRequest(req,res);
    }
}).listen(3000,()=>{
    console.log("服务器开启成功")
})

function fileRequest(req,res){
    const p = url.parse(req.url).pathname;
    fs.readFile("./www" + p, (err,data)=>{
        if(err){
            res.write("404")
        }else{
            res.write(data)
        }
        res.end()
    })
}
function dataRequest(req,res){
    if(req.method === "GET"){
        const data = url.parse(req.url, true).query
        transit(req,res,data)
    }else if(req.method === "POST"){
        let str = ""
        req.on("data",d=>{
            str += d;
        })
        req.on("end",()=>{
            const data = qs.parse(str);
            transit(req,res,data)
        })
    }
}
function transit(req,res,data){
    switch(data.type){
        case "getGoods":
            getGoods(req,res,data);break;
        case "getDetail":
            getDetail(req,res,data);break;    
        case "register":
            register(req,res,data);break;
        case "login":
            login(req,res,data);break;
        default:
            err(req,res,data);
    }
}


function login(req,res,reqData){
    // 1. 先读取用户信息
    fs.readFile("./databases/userMsg.json","utf-8",(err,data)=>{
        // 解析数据
        const userMsg = err ? [] : JSON.parse(data);
        // 2. 遍历并查找用户信息
        let i=0;
        const flag = userMsg.some((val,idx)=>{
            i = idx;
            return val.username === reqData.username;
        })
        const obj = {};
        if(flag){
            if(userMsg[i].password === reqData.password){
                // 5. 登录成功
                obj.code = 1;
                obj.title = "登录成功";
                // 真实情况下，登录成功之后，后端必然会记录登录信息
                // 还会生成唯一token，并响应给前端
                obj.data = {username:reqData.username};
            }else{
                // 4. 密码不对，登录失败
                obj.code = 2
                obj.title = "密码不对，登录失败";
                obj.data = {};
            }
        }else{
            // 3. 用户名不存在，登录失败
            obj.code = 0
            obj.title = "用户名不存在，登录失败";
            obj.data = {};
        }
        res.write(JSON.stringify(obj));
        res.end();
    })
}

// [{},{},{}]

function register(req,res,reqData){
    // 1. 先读取现有用户信息
    fs.readFile("./databases/userMsg.json", "utf-8", (err, data)=>{
        // 处理默认值
        const userMsg = err ? [] : JSON.parse(data);
        // 2. 从已有数据中查询，是否有相同用户名
        const flag = userMsg.some(val=>val.username === reqData.username);
        if(flag){
            // 3. 重名
            const obj = {}
            obj.code = 0;
            obj.title = "用户名重复，注册失败";
            obj.data = {};
            res.write(JSON.stringify(obj))
            res.end();
        }else{
            // 4. 没有重名，准备存储数据库
            userMsg.push({
                username:reqData.username,
                password:reqData.password
            })
            fs.writeFile("./databases/userMsg.json", JSON.stringify(userMsg),(err)=>{
                const obj = {};
                // 5. 存入数据库失败
                if(err){
                    obj.code = 2;
                    obj.title = "没有重名，但是写入数据库失败";
                    obj.data = {};
                }else{
                    // 6. 存入成功，注册成功
                    obj.code = 1;
                    obj.title = "注册成功";
                    obj.data = {};
                }
                res.write(JSON.stringify(obj))
                res.end();
            })
        }
    })
}



function getDetail(req,res,reqData){
    fs.readFile("./databases/goods.json", "utf-8", (err,data)=>{
        if(err){
            obj.code = 0;
            obj.title = "读取失败";
            obj.data = {};
            res.write(JSON.stringify(obj));
            res.end()
        }else{
            const goodsData = JSON.parse(data);
            let i=null;
            goodsData.some((val,idx)=>{
                i = idx;
                return val.id === reqData.id;
            })
            const obj = {};
            if(i === null){
                obj.code = 2;
                obj.title = "当前商品不存在";
                obj.data = {};
            }else{
                obj.code = 1;
                obj.title = "读取单个商品成功";
                obj.data = goodsData[i];
            }
            res.write(JSON.stringify(obj));
            res.end()
        }
    })
}
function getGoods(req,res,reqData){
    fs.readFile("./databases/goods.json", "utf-8", (err,data)=>{
        const obj = {};
        if(err){
            obj.code = 0;
            obj.title = "读取失败";
            obj.data = [];
        }else{
            obj.code = 1;
            obj.title = "读取成功";
            obj.data = JSON.parse(data);
        }
        res.write(JSON.stringify(obj));
        res.end()
    })
}
function err(req,res,data){
    // console.log("err", data)
    res.end()
}

